2026-10-18T10:55:31.9575828Z ##[group]Run npm run test:deploy
2026-10-18T10:55:31.9575879Z [36;1mnpm run test:deploy[0m
2026-10-18T10:55:31.9575902Z shell: /usr/bin/bash -e {0}
2026-10-18T10:55:31.9575921Z env:
2026-10-18T10:55:31.9575935Z   CARGO_TERM_COLOR: never
2026-10-18T10:55:31.9575959Z   WRANGLER_SEND_METRICS: false
2026-10-18T10:55:31.9575974Z ##[endgroup]
2026-10-18T10:55:32.1383295Z 
2026-10-18T10:55:32.1383464Z > test:deploy
2026-10-18T10:55:32.1383493Z > node --test "scripts/deploy/*.test.mjs"
2026-10-18T10:55:32.1383551Z 
2026-10-18T10:55:32.3081410Z ✔ a release's version bump keeps the Rust caches' key, a new dependency changes it (3.549317ms)
2026-10-18T10:55:32.3084146Z ✔ the toolchain is read from rustc -V (0.500351ms)
2026-10-18T10:55:32.3086079Z ✔ the CLI's builder image is pinned, and keys its cache by its digest (0.31051ms)
2026-10-18T10:55:32.3111804Z ✔ a unit's hash is read from its files and folders (0.356431ms)
2026-10-18T10:55:32.3132109Z ✔ only the units the build did not use are pruned (3.311316ms)
2026-10-18T10:55:33.9205232Z error: no matching package named `base64` found
2026-10-18T10:55:33.9205369Z location searched: crates.io index
2026-10-18T10:55:33.9205562Z required by package `g1t-api v0.1.0 (/home/runner/work/repo/apps/api)`
2026-10-18T10:55:33.9205771Z note: offline mode (via `--offline`) can sometimes cause surprising resolution failures
2026-10-18T10:55:33.9205883Z help: if this error is too confusing you may wish to retry without `--offline`
2026-10-18T10:55:34.4091678Z ✔ the manifest matches every wrangler config in the repository (49.810145ms)
2026-10-18T10:55:34.4096222Z ✔ every wrangler.jsonc is found, and only checked-in ones (49.378314ms)
2026-10-18T10:55:34.4099594Z ✔ problems are found: an unlisted config, a later-stage binding, a wrong database, an unnamed KV (45.071206ms)
2026-10-18T10:55:34.4103608Z ✔ stages follow bindings: nothing binds to a unit that ships after it (0.660172ms)
2026-10-18T10:55:34.4110800Z ✔ inside a stage, a Worker that does not exist yet goes before those bound to it (1.324932ms)
2026-10-18T10:55:34.4114953Z ✔ Rust workers build with the shared script and the same wasm-opt level (1.328022ms)
2026-10-18T10:55:34.4116555Z ✔ shared crates and packages are read from workspace metadata (0.306541ms)
2026-10-18T10:55:34.4134314Z ✔ the runner's image is built from the runner crate and what it uses, on the base its lock names (0.673421ms)
2026-10-18T10:55:34.4134529Z ✔ services/runner/base.json records the base its folder builds (16.562762ms)
2026-10-18T10:55:34.4134770Z ✔ an image's hash ignores line endings, and its tags say what they are (176.518367ms)
2026-10-18T10:55:34.4137318Z ✔ only the lockfile entries the runner is built from name its image (0.390521ms)
2026-10-18T10:55:34.4150361Z ✔ the runner's deploy config names its image by reference, beside its wrangler.jsonc (26.09195ms)
2026-10-18T10:55:34.4156009Z ✔ the registry is asked for an image's manifest, without Docker (1.181522ms)
2026-10-18T10:55:34.4158245Z ✔ a push counts only when it ends with a digest, and is tried again (1.117642ms)
2026-10-18T10:55:34.4160006Z ✔ a static Linux binary is told from a dynamic one (1.224192ms)
2026-10-18T10:55:34.4163323Z ﹣ path dependencies agree with Cargo's own resolved graph (943.390149ms) # cargo metadata could not resolve offline
2026-10-18T10:55:34.4250201Z ✔ every import that leaves a unit's folder is covered by its dependencies or inputs (105.920542ms)
2026-10-18T10:55:34.4250355Z ✔ a shared crate's change reaches every unit built from it, and no other (1.068282ms)
2026-10-18T10:55:34.4250432Z ✔ a shared package's change reaches what imports it (0.45756ms)
2026-10-18T10:55:34.4250502Z ✔ a crate's tests, benches and examples deploy nothing (0.768552ms)
2026-10-18T10:55:34.4250570Z ✔ a Rust file compiled only for tests is found from what declares it (2.056684ms)
2026-10-18T10:55:34.4250627Z ✔ this repository's test-only sources are read from git (344.868358ms)
2026-10-18T10:55:34.4250698Z ✔ decide: a change only to tests deploys nothing (3.170826ms)
2026-10-18T10:55:34.4250775Z ✔ own folders, declared inputs and root files (0.989352ms)
2026-10-18T10:55:34.4250850Z ✔ a Cargo.lock change reaches only crates that use what changed (0.956281ms)
2026-10-18T10:55:34.4250937Z ✔ a package-lock change reaches through workspace links (0.781421ms)
2026-10-18T10:55:34.4251052Z ✔ decide: changed units deploy, others wait, unknown ones deploy (0.609121ms)
2026-10-18T10:55:34.4251118Z ✔ decide: --force deploys unchanged units; a commit missing from history deploys (0.337381ms)
2026-10-18T10:55:34.4251174Z ✔ decide: Cargo.lock counts only where it reaches (0.977952ms)
2026-10-18T10:55:34.4251237Z ✔ decide: the runner's image rebuilds only when what it is built from changed (0.483271ms)
2026-10-18T10:55:34.4251883Z ✔ the plan as data: migrations, and each stage's units in jobs that share a build (1.959434ms)
2026-10-18T10:55:34.4253429Z ✔ units are picked by short name, folder or Worker name (1.001282ms)
2026-10-18T10:55:34.4259156Z ✔ a CI job installs only what its units need (3.603087ms)
2026-10-18T10:55:34.4274278Z ✔ a deploy is annotated with its commit, and read back (0.640731ms)
2026-10-18T10:55:34.4275021Z ✔ the live commit: the live version's, looking through secret changes (0.766681ms)
2026-10-18T10:55:34.4275346Z ✔ Wrangler's output: pending migrations and the version a deploy made (0.653771ms)
2026-10-18T10:55:34.4275911Z ✔ the API's answers: the live commit as Wrangler's would give it (1.871083ms)
2026-10-18T10:55:34.9070452Z ✔ the API's answers: a Worker never deployed, and a refusal, never throw (503.445511ms)
2026-10-18T10:55:34.9071785Z ✔ the API is used only with the token Wrangler would be given (0.845371ms)
2026-10-18T10:55:34.9076895Z ✔ pending migrations: the folder's files less the names in d1_migrations (2.427624ms)
2026-10-18T10:55:35.0022701Z ✔ the pool runs everything, no more than its limit at once (15.58713ms)
2026-10-18T10:55:35.0039970Z ✔ self-hosting builds every Rust service the manifest says it runs (1.390263ms)
2026-10-18T10:55:35.0041389Z ✔ the self-hosting architecture page names every unit (0.393521ms)
2026-10-18T10:55:35.0042355Z ✔ the architecture's services page names every unit, with the services it binds to (4.800179ms)
2026-10-18T10:55:35.0043566Z ✔ resolveStack works on a manifest with no workspace crates or packages (5.38561ms)
2026-10-18T10:55:35.0114878Z ✔ decide: a commit older than what runs is never deployed by accident, even forced; --rollback means it (0.46615ms)
2026-10-18T10:55:35.0115045Z ✔ a deploy by hand reports to the repository on g1t, and a workflow's does not (2.589805ms)
2026-10-18T10:55:35.0115157Z ✔ a failed wrangler command is reported by its error, not its trace (0.408411ms)
2026-10-18T10:55:35.0115243Z ✔ Cloudflare failing is tried again; a mistake in what is deployed is not (0.555421ms)
2026-10-18T10:55:35.0115360Z ✔ sandboxes roll over at once when their image or container settings changed, and not otherwise (0.406041ms)
2026-10-18T10:55:35.0115458Z ✔ the deploy tool itself parses: a test that never imports it would not notice (62.594909ms)
2026-10-18T10:55:35.5623144Z ✔ the statements are all there (1.812813ms)
2026-10-18T10:55:35.5637508Z ✔ twenty invites each: the twenty-first is refused in the statement that writes (70.602285ms)
2026-10-18T10:55:35.5664590Z ✔ revoking an unused invite gives it back; an expired one never counted (127.469673ms)
2026-10-18T10:55:35.5664779Z ✔ a used invite is spent: revoking it does nothing and it still counts (62.75851ms)
2026-10-18T10:55:35.5667442Z ✔ a pending invite for the same address is found; a revoked one is not (60.912666ms)
2026-10-18T10:55:35.5691854Z ✔ staff grants add to the twenty and can take some back (61.019857ms)
2026-10-18T10:55:35.5692699Z ✔ signing up from the link spends the invite once and records who invited whom (58.959982ms)
2026-10-18T10:55:35.6643300Z ✔ a body that broke off is worth another try, a lockfile out of step is not (1.724163ms)
2026-10-18T10:55:35.6650812Z ✔ an install that ends without saying why, or stalls, is tried again (0.281861ms)
2026-10-18T10:55:35.6665905Z ✔ a dropped connection is tried again until the install passes (3.611837ms)
2026-10-18T10:55:35.6668749Z ✔ a real error fails at once (0.427201ms)
2026-10-18T10:55:35.6670616Z ✔ it gives up after its tries, with npm's exit code (0.393061ms)
2026-10-18T10:55:35.6672334Z ✔ a stalled install is run again (0.309631ms)
2026-10-18T10:55:35.8969204Z ✔ webhooks: the hourly purge deletes old deliveries by time (3.701947ms)
2026-10-18T10:55:35.8969934Z ✔ billing: this month's users are read from an index, not the ledger (91.162714ms)
2026-10-18T10:55:35.8970459Z ✔ events: a repository's events of one type, newest first, page by page (9.108107ms)
2026-10-18T10:55:35.8970564Z ✔ actions: a self-hosted runner's poll finds queued jobs by namespace, whatever its case (19.215046ms)
2026-10-18T10:55:35.8971739Z ✔ chat: a channel's messages and a thread's replies, newest first, page by page (4.614978ms)
2026-10-18T10:55:35.8971997Z ✔ chat: the sidebar's unread messages are read from each channel's index, after the last read (4.651218ms)
2026-10-18T10:55:35.8981623Z ✔ chat: a page's reactions are read by message, and a workspace's emoji by name (4.572148ms)
2026-10-18T10:55:36.0657077Z ✔ the runner's layer is the binary alone, at its path and mode, owned by root (6.163472ms)
2026-10-18T10:55:36.0661211Z ✔ the layer and entrypoint are what services/runner/Dockerfile builds (0.791091ms)
2026-10-18T10:55:36.0669309Z ✔ the config is the base's, with the layer, the entrypoint and no inherited command (1.127672ms)
2026-10-18T10:55:36.0681250Z ✔ the manifest names the base's layers, then the binary's, in the base's format (0.41056ms)
2026-10-18T10:55:36.0728587Z ✔ image references and bearer challenges are read (0.959751ms)
2026-10-18T10:55:36.0771489Z ✔ the runner's image is made in the registry from the base's manifest and one new layer, pulling none of the base (45.817827ms)
2026-10-18T10:55:36.0771872Z ✔ a base that is not where it should be, or not what base.json says, stops it (2.249455ms)
2026-10-18T10:55:36.0772356Z ✔ a registry that asks for a bearer token is given the one its realm trades the credentials for (3.948687ms)
2026-10-18T10:55:36.1642189Z scheduler: g1t-webhooks (* * * * *) is still running from the last time; skipped
2026-10-18T10:55:36.2126385Z scheduler: g1t-webhooks (* * * * *): 200 {"outcome":"exception"}
2026-10-18T10:55:36.2184833Z ✔ fields read numbers, ranges, lists and steps (2.949366ms)
2026-10-18T10:55:36.2200573Z ✔ the services' crons match when hosted g1t's would fire (2.663195ms)
2026-10-18T10:55:36.2207125Z ✔ what is due is each matching cron of each service (0.559451ms)
2026-10-18T10:55:36.2218615Z ✔ a run asks Wrangler for the handler, and a slow one is not doubled (50.133735ms)
2026-10-18T10:55:36.3666935Z ✔ a deploy is announced to status.g1t.sh with the token, and without one nothing is sent (47.17872ms)
2026-10-18T10:55:36.5093970Z ✔ an announcement that fails is a warning, never a failed deploy (0.947022ms)
2026-10-18T10:55:36.5094367Z ✔ the stages run inside the window: started before, finished after, even when they throw; a dry run says nothing (1.537293ms)
2026-10-18T10:55:36.5094462Z ✔ deploy.mjs announces every deploy, and the workflow passes it the token (0.899622ms)
2026-10-18T10:55:36.6327475Z ✔ discover actual hashed assets without archiving icons, source maps or library defaults (3.617127ms)
2026-10-18T10:55:36.6328195Z ✔ archive the old release's transitive chunks before replacing it (49.188194ms)
2026-10-18T10:55:36.6328446Z ✔ archive failures block cutover and immutable filename collisions are refused (5.781401ms)
2026-10-18T10:55:36.6343862Z ✔ a missing live asset aborts the archive instead of saving an HTML error as CSS (1.749083ms)
2026-10-18T10:55:36.6345451Z ✔ a release manifest skips unchanged uploads without scanning deployment history (1.693963ms)
2026-10-18T10:55:36.6346814Z ✔ provider rate limits wait and retry; persistent failure remains a failure (3.645887ms)
2026-10-18T10:55:36.6353904Z ✔ cutover verifies old and new assets and rejects HTML fallback or wrong build (5.65814ms)
2026-10-18T10:55:36.6373647Z ✔ cutover tolerates propagation delay but still requires the expected build and asset bytes (4.225428ms)
2026-10-18T10:55:39.7931883Z ✔ 1000 successive releases keep old tabs' assets and perform bounded incremental archive work (3166.395209ms)
2026-10-18T10:55:39.9970092Z ℹ tests 101
2026-10-18T10:55:39.9970329Z ℹ suites 0
2026-10-18T10:55:39.9970359Z ℹ pass 100
2026-10-18T10:55:39.9970384Z ℹ fail 0
2026-10-18T10:55:39.9970403Z ℹ cancelled 0
2026-10-18T10:55:39.9970420Z ℹ skipped 1
2026-10-18T10:55:39.9970442Z ℹ todo 0
2026-10-18T10:55:39.9970467Z ℹ duration_ms 7628.053589
